package com.ruoyi.system.util.AudioSplitter;

import com.ruoyi.system.service.impl.XunFei;

import javax.sound.sampled.*;
import java.io.File;
import java.io.IOException;
import java.net.URISyntaxException;

public class WavMillisecondSplitter {

    /**
     * 按毫秒分割 WAV 文件
     *
     * @param inputFile  输入文件
     * @param outputFile 输出文件
     * @param startMs    开始时间（毫秒）
     * @param endMs      结束时间（毫秒）
     */
    public static void splitWavByMilliseconds(File inputFile, File outputFile, long startMs, long endMs) {
        try {
            // 打开输入文件
            System.out.println(inputFile);
            AudioInputStream audioInputStream = AudioSystem.getAudioInputStream(inputFile);
            AudioFormat format = audioInputStream.getFormat();

            // 计算开始和结束的帧数
            long startFrame = millisecondsToFrames(format, startMs);
            long endFrame = millisecondsToFrames(format, endMs);
            long frameLength = endFrame - startFrame;

            // 跳过开始部分
            audioInputStream.skip(startFrame * format.getFrameSize());

            // 创建新的 AudioInputStream 用于输出
            AudioInputStream clippedStream = new AudioInputStream(
                    audioInputStream, format, frameLength
            );

            // 写入输出文件
            AudioSystem.write(clippedStream, AudioFileFormat.Type.WAVE, outputFile);

            // 关闭流
            audioInputStream.close();
            System.out.println("Audio split successfully: " + outputFile.getAbsolutePath());
        } catch (UnsupportedAudioFileException | IOException e) {
            e.printStackTrace();
        }
    }

    /**
     * 将毫秒转换为帧数
     *
     * @param format 音频格式
     * @param millis 毫秒
     * @return 对应的帧数
     */
    private static long millisecondsToFrames(AudioFormat format, long millis) {
        float frameRate = format.getFrameRate(); // 每秒帧数
        return (long) (millis * frameRate / 1000);
    }

    public static void main(String[] args) throws URISyntaxException {
        File inputFile = new File(XunFei.class.getResource("/").toURI().getPath() + "/audio/456.wav");
        File outputFile = new File(XunFei.class.getResource("/").toURI().getPath() + "/audio/output_part3.wav");

        // 示例：从 1000 毫秒（1 秒）到 3000 毫秒（3 秒）分割
        splitWavByMilliseconds(inputFile, outputFile, 1000, 3000);



        //    public static void main(String[] args) throws Exception {
//        File input = new File(Ifasrdemo.class.getResource("/").toURI().getPath() + "/audio/456.wav");
//        System.out.println(Ifasrdemo.class.getResource("/").toURI().getPath());
//        splitWavByTime(input, 2, 10, new File(Ifasrdemo.class.getResource("/").toURI().getPath() + "/audio/output_part2.wav")); // 截取前5分钟

    }
}
